
%{
#include <stdio.h>
#include <math.h>
#include "tabelas.c"

char reservadas[26][30];
simbo sim;
simbo *tab_sim;
char tab_tipo[N_TIPOS][MAX_TAM_TIPOS];
int n = 0;
int numTipos = 2;
int tag = 0;
int coment = 0;
int pal_reser = 0;

%}
REAL [0-9]+.[0-9]+
INTEIRO [0-9]
IDENT [a-zA-Z][a-zA-Z0-9]*
ESPACO [" "\t\n\r]
OUTROS [a-zA-Z0-9]*[!@#$%¨&´`^~ªº\|£¢¬°§áàâãûüóòõô]*[a-zA-Z0-9]*
%%
"."		{ if(coment != 1) {printf("%s - Simbolo_Ponto\n", yytext, yytext); return (".", PONTO);} return COMENTARIO;}


"="		{ if(coment != 1) {printf("%s - Simbolo_Igual\n", yytext, yytext); return ("=", IGUAL);} return COMENTARIO;}

"<>"		{ if(coment != 1) {printf("%s - Simbolo_Diferente\n", yytext, yytext);return ("<>",DIFERENTE); } return COMENTARIO;}

">"		{ if(coment != 1) {printf("%s - Simbolo_Maior\n", yytext, yytext); return (">", MAIOR);} return COMENTARIO;}

"<"		{ if(coment != 1) {printf("%s - Simbolo_Menor\n", yytext, yytext); return ("<", MENOR) ;} return COMENTARIO; }

">="		{ if(coment != 1) {printf("%s - Simbolo_Maior_Igual\n", yytext, yytext);  return (">=", MAIOR_IGUAL);} return COMENTARIO;}

"<="		{ if(coment != 1) {printf("%s - Simbolo_Menor_Igual\n", yytext, yytext); return ("<=", MENOR_IGUAL);} return COMENTARIO;}

":="		{ if(coment != 1) {printf("%s - Simbolo_Atribuicao\n", yytext, yytext); return (":=", ATRIBUICAO);} return COMENTARIO;}

";"		{ if(coment != 1) {printf("%s - Simbolo_Ponto_Virgula\n", yytext, yytext); return (";", PONTO_VIRGULA);} return COMENTARIO;}

":"		{ if(coment != 1) {printf("%s - Simbolo_Dois_Pontos\n", yytext, yytext); tag = 3; return (":", DOIS_PONTOS);} return COMENTARIO;}

","		{ if(coment != 1) {printf("%s - Simbolo_Virgula\n", yytext, yytext);  return (",", VIRGULA);} return COMENTARIO;}

"("		{ if(coment != 1) {printf("%s - Simbolo_Abre_Parenteses\n", yytext, yytext);  return ("(", ABRE_PARANTESES);} return COMENTARIO;}

")"		{ if(coment != 1) {printf("%s - Simbolo_Fecha_Parenteses\n", yytext, yytext);  return (")", FECHA_PARENTESES); }return COMENTARIO;}

"{"		{  coment = 1; return ABRE_COMENTARIO;}

"}"		{  coment = 0; return FECHA_COMENTARIO;}

"+"		{ if(coment != 1) {printf("%s - Simbolo_Mais\n", yytext, yytext);  return ("+",SINAL_MAIS);} return COMENTARIO;}

"-"		{ if(coment != 1) {printf("%s - Simbolo_Menos\n", yytext, yytext);  return ("-", SINAL_MENOS);} return COMENTARIO;}

"*"		{ if(coment != 1) {printf("%s - Simbolo_Multiplicacao\n", yytext, yytext);  return ("*", SINAL_MULTI);} return COMENTARIO;}

"/"		{ if(coment != 1) {printf("%s - Simbolo_Divisao\n", yytext, yytext);  return ("/", SINAL_DIV);} return COMENTARIO;}

{ESPACO}+	{continue;}

{INTEIRO}+	{ if(coment != 1){ printf("%d - numero inteiro\n", atoi( yytext ) );  return INTEGER;} return COMENTARIO;}

{REAL}+		{ if(coment != 1) {printf("%f - numero real\n", atof( yytext ) ); return REAL;} return COMENTARIO;}

{IDENT}		{ 
		  sim.id = yytext;

		  if(coment == 1){
			return COMENTARIO;	
			}
		  else
		  if(tag == 3){
			tag = 0;
			
			if(buscaTipo(tab_tipo, sim.id, numTipos)){
				printf("%s - tipo de dado\n", yytext);
				}
			else{
				printf("%s - Erro: tipo incorreto\n", yytext);
				return (yytext, ERRO_TIPO_DADO);				
				}
			
		  }
		  else
		  	if(buscaPalavraReservada(reservadas, sim, &tag, &pal_reser)){
		  		printf("%s - %s\n", yytext, yytext);
				return (yytext, pal_reser);
				
				}
		  else
			if(strlen(sim.id) > MAX_TAM_VAR){
				printf("%s - Erro: identificador muito grande\n", yytext);
				return (yytext, ERRO_IDENT_GRANDE); }
		 else
			if(adicionarSimb(tab_sim, sim.id, &n, &tag))	
			
				printf("%s - identificador\n", yytext);
		  else
		  	if(!buscaElem(tab_sim, sim.id, n)){
				printf("%s - Erro: identificador não declarado\n", yytext); 
				return (yytext, ERRO_IDENT_NDECL);}
		  else
				printf("%s - Identificador\n", yytext);
		  return (yytext, IDENT);
		}	
{OUTROS}	{  if(coment == 1){return COMENTARIO;} else printf("%s - Erro: cadeia Inválida\n", yytext);   return (yytext, ERRO_CADEIA_INVA);
			}		
%%

int main()
{
  tab_sim = (simbo*) malloc(MAX_SIMBO*sizeof(simbo));
  inicializaTipo(tab_tipo);
  inicializaPalavrasReservadas(reservadas);
  
 while(yylex()){ 
  //yylex();
}

 if(EOF && coment == 1)
	printf("Erro: comentário não encerrado corretamente\n");
	
return 0;
}

